package br.gov.ibama.client.comum;

import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;

public class CadeiaDeExecucao {

	private Queue<Executor> executores;
	private Map<String, Object> atributos;

	public CadeiaDeExecucao() {
		this.executores = new LinkedList<Executor>();
		this.atributos = new HashMap<String, Object>();
	}

	public void adiciona(Executor filtro) {
		this.executores.add(filtro);
	}

	public void adicionaTodos(Executor[] filtros) {
		adicionaTodos(Arrays.asList(filtros));
	}

	public void adicionaTodos(List<Executor> filtros) {
		this.executores.addAll(filtros);
	}

	public void executa() {
		Executor proximo = executores.poll();
		if (proximo != null) {
			proximo.executa(this);
		}
	}

	@SuppressWarnings("unchecked")
	public <C> C getAtributo(String chave, Class<C> tipo) {
		return (C) atributos.get(chave);
	}

	public void setAtributo(String chave, Object valor) {
		atributos.put(chave, valor);
	}

}
